home *** CD-ROM | disk | FTP | other *** search
- /* an example of an XFun that operates on arrays.
- Accumulates a histogram given an array of values. */
-
- #include "callback.h"
-
- static short histogram(double *retval,funptr callback)
- {
- EXPR arr;
- double *iptr,*bins,num,binlo,binhi,scl;
- long ndata,i,nbins;
- double sum;
- short isarray;
-
- if(!GetParmVal(2,&binlo,callback)) return(FALSE);
- if(!GetParmVal(1,&binhi,callback)) return(FALSE);
- if(!GetParmVal(0,&num,callback)) return(FALSE);
- nbins = num;
- if(nbins <= 0 || binlo == binhi)
- {
- ErrMsg(" illegal parameter value",0,callback);
- return(FALSE);
- }
-
- MakeParmExpr(3,&arr,callback);
- ProbeExpr(arr,&num,&isarray,&ndata,callback);
- if(!isarray || !ndata) /* expecting a finite array */
- {
- ErrMsg(" histogram(?,…) array size?",0,callback);
- FreeExpr(arr,callback);
- return(FALSE);
- }
-
- scl = nbins/(binhi-binlo);
- bins = (double *)NewPtrClear(nbins*sizeof(double));
- if(!bins)
- {
- ErrMsg(" not enough memory",0,callback);
- FreeExpr(arr,callback);
- return(FALSE);
- }
-
- AddIndex(&arr,&iptr,callback);
-
- sum = 0;
- *retval = 0;
- *iptr = 1;
- while(ndata--)
- {
- if(EvalExpr(arr,&num,callback)) /* evaluate arr[*iptr] */
- {
- i = (num-binlo)*scl;
- if(i>=0 && i<nbins)
- {
- bins[i] += 1;
- *retval += 1; /* function return value is total points within range */
- sum += num;
- }
- }
- *iptr += 1;
- if(Stopped(callback)) break; /* exit loop if problems */
- }
- FreeExpr(arr,callback);
- SetVarMatrix("bins",bins,nbins,0,callback); /* return histogram in global array "bins" */
- SetVarVal("mean",sum / *retval,callback); /* return mean in global "mean" */
- return(TRUE);
- }
-
- main(funptr callback)
- {
- AddXfun("histogram","array,lo,hi,nbins",&histogram,0,callback);
- }
-
-
-